package com.hulk.dryad.common.util;





/**
 * @author hulk
 *
 */

public class CheckDigitUtil {



    /**
     * 获取校验码
     * @param noStr 未含校验位的商户编号
     * @param length
     * @param keyPosition
     * @return 返回校验位
     */
    public static String getKey(String noStr, int length, int keyPosition){
        String key = null;
        if(length == -1){
            length = noStr.length();
        }
        if(keyPosition == -1){
            keyPosition = noStr.indexOf("X") + 1;
        }
        if(length == 21 && keyPosition == 18){
            key = get2118Key(noStr);
        }
        if(length == 16 && keyPosition == 16){
            key = get1616Key(noStr);
        }
        if(length == 16 && keyPosition == 15){
            key = get1615Key(noStr);
        }
        if(length == 32 && keyPosition == 32){
            key = get3232Key(noStr);
        }
        return key;
    }

  
    /**
     * 21位长度，校验位在第18位的校验位算法
     * @param noStr
     * @return 返回校验位
     */
    private static String get2118Key(String noStr){
        int[] i = transStringToInt(noStr);
        int val = (i[0] * 83 + i[1] * 89 + i[2] * 7 +
                i[3] * 13 + i[4] * 17 + i[5] * 19 +
                i[6] * 23 + i[7] * 29 + i[8] * 31 +
                i[9] * 37 + i[10] * 41 + i[11] * 43 +
                i[12] * 47 + i[13] * 53 + i[14] * 59 +
                i[15] * 61 + i[16] * 67 + i[18] * 71 +
                i[19] * 73 + i[20] * 79)%10;

        return val + "";
    }

    /**
     * 16位长度，第16位为校验位
     * @param noStr
     * @return 返回校验位
     */
    private static String get1616Key(String noStr){
        int[] i = transStringToInt(noStr);
        int val = (i[0] * 83 + i[1] * 89 + i[2] * 7 +
                i[3] * 13 + i[4] * 17 + i[5] * 19 +
                i[6] * 23 + i[7] * 29 + i[8] * 31 +
                i[9] * 37 + i[10] * 41 + i[11] * 43 +
                i[12] * 47 + i[13] * 53 + i[14] * 59)%10;

        return val + "";
    }

    /**
     * 32位长度，校验位在第32位的校验位算法
     * @param noStr
     * @return 返回校验位
     */
    @Deprecated
    private static String get3232Key(String noStr){
    	 int[] i = transStringToInt(noStr);
         int val = (i[0] * 83 + i[1] * 89 + i[2] * 7 +
                 i[3] * 13 + i[4] * 17 + i[5] * 19 +
                 i[6] * 23 + i[7] * 29 + i[8] * 31 +
                 i[9] * 37 + i[10] * 41 + i[11] * 43 +
                 i[12] * 47 + i[13] * 53 + i[14] * 59 + 
               
                 i[15] * 83 + i[16] * 89 + i[17] * 7 +
                 i[18] * 13 + i[19] * 17 + i[20] * 19 +
                 i[21] * 23 + i[22] * 29 + i[23] * 31 +
                 i[24] * 37 + i[25] * 41 + i[26] * 43 +
                 i[27] * 47 + i[28] * 53 + i[29] * 59 + 
                 i[30] * 61
        		 )%10;

        return val + "";
    }
    
    /**
     * 16位长度，第15位为校验位
     * @param noStr
     * @return 返回校验位
     */
    private static String get1615Key(String noStr){
        int[] i = transStringToInt(noStr);
        int val = (i[0] * 83 + i[1] * 89 + i[2] * 7 +
                i[3] * 13 + i[4] * 17 + i[5] * 19 +
                i[6] * 23 + i[7] * 29 + i[8] * 31 +
                i[9] * 37 + i[10] * 41 + i[11] * 43 +
                i[12] * 47 + i[13] * 53 + i[15] * 59)%10;

        return val + "";
    }

    /**
     * 字符串转int数组
     * @param noStr
     * @return 返回int数组
     */
    private static int[] transStringToInt(String noStr){
        int[] n = new int[noStr.length()];
        for(int i = 0;i<noStr.length();i++){
            if(!"X".equals(noStr.substring(i,i+1))){
                n[i] = Integer.parseInt(noStr.substring(i,i+1));
            }else{
                n[i] = 0;
            }

        }
        return n;
    }
    
    public static void main(String[] args) {
    	//CheckDigitTool  t = new CheckDigitTool();
    	//System.out.println(t.get3232Key("12345678901234561234567890123456"));
		
	}
}
